package com.yt.sys.api.client;

import com.yt.common.constant.Result;
import com.yt.common.enums.CodeEnum;
import com.yt.db.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID; // 添加 UUID 导入

@RestController
@RequestMapping("/api/auth")
public class AuthController {

    /**
     * Redis工具类，用于存储和验证用户token
     */
    @Autowired
    private RedisUtil redisUtil;

    /**
     * 用户登录接口
     * 验证用户凭据并生成认证token
     *
     * @param username 用户名
     * @param password 密码
     * @return 认证结果，包含token、角色和用户名
     */
    @PostMapping("/login")
    public Result<Map<String, Object>> login(
            @RequestParam("username") String username,
            @RequestParam("password") String password) {
        
        String token;
        String role;

        // 验证测试账户凭据
        if ("admin".equals(username) && "admin123".equals(password)) {
            token = generateToken();
            role = "admin";
        } else if ("client".equals(username) && "client123".equals(password)) {
            token = generateToken();
            role = "client";
        } else if ("staff".equals(username) && "staff123".equals(password)) {
            token = generateToken();
            role = "staff";
        } else {
            // 用户名或密码错误
            return new Result<>(CodeEnum.FAIL_Login_1002);
        }
        
        // 将token存储到Redis中，设置过期时间（2小时）
        redisUtil.set(token, username, 7200); // 2小时过期
        
        // 构造返回结果
        Map<String, Object> result = new HashMap<>();
        result.put("token", token);
        result.put("role", role);
        result.put("username", username);
        
        return new Result<>(result);
    }

    /**
     * 用户登出接口
     * 清除用户的认证信息
     *
     * @param authorization 包含token的Authorization头
     * @return 操作结果
     */
    @PostMapping("/logout")
    public Result<Void> logout(@RequestHeader("Authorization") String authorization) {
        // 检查Authorization头是否存在且格式正确
        if (authorization != null && authorization.startsWith("Bearer ")) {
            // 提取token并从Redis中删除
            String token = authorization.substring(7);
            redisUtil.del(token);
        }
        return new Result<>();
    }

    /**
     * Token验证接口
     * 验证token是否有效并更新过期时间
     *
     * @param authorization 包含token的Authorization头
     * @return 验证结果，包含用户名和有效性标识
     */
    @GetMapping("/verify")
    public Result<Map<String, Object>> verify(@RequestHeader("Authorization") String authorization) {
        // 检查Authorization头是否存在且格式正确
        if (authorization == null || !authorization.startsWith("Bearer ")) {
            return new Result<>(CodeEnum.FAIL_100004);
        }
        
        // 提取token并验证
        String token = authorization.substring(7);
        Object username = redisUtil.validateToken(token);
        
        // token无效
        if (username == null) {
            return new Result<>(CodeEnum.FAIL_User_800002);
        }
        
        // 更新token过期时间（延长2小时）
        redisUtil.expire(token, 7200);
        
        // 构造返回结果
        Map<String, Object> result = new HashMap<>();
        result.put("username", username);
        result.put("isValid", true);
        
        return new Result<>(result);
    }

    /**
     * 生成随机token
     * 使用UUID生成唯一的token字符串
     * 
     * @return token字符串
     */
    private String generateToken() {
        return "Bearer " + UUID.randomUUID().toString().replace("-", "");
    }
}